﻿//----------------------------------------------------------------
// Desc: CSV文件读取
// Edit: ShowLong, http://blog.csdn.net/showlong
//
// Date Created: 2011-01-17
//
// Update Date : 
//
// Copyright (c) Fuel4D (http://www.fuel4d.com), All rights reserved.
//
// 使用方法:
//   IFCSV* csv = FNewCSV(FNEW_INFO);
//   if (csv->Open(_FT("file.csv")))
//   {
//       while (!csv->IsEOF())
//       {
//           for (short i = 0; i < csv->GetColumnCount(); ++i)
//               csv->GetString(i);
//           csv->MoveNext();
//       }
//   }
//   FDel(csv);
//----------------------------------------------------------------
#pragma once


class IFCSV : public IFMemObject
{
protected:
    explicit IFCSV()
    {}

public:
    // 打开CSV文件
    // .filename 文件路径名
    FINLINE bool Open (const NCHAR* filename);
    virtual bool OpenW(const WCHAR* filename) = 0;
    virtual bool OpenA(const ACHAR* filename) = 0;
    // 关闭CSV文件
    virtual void Close() = 0;
    // 获取当前打开的CSV文件
    FINLINE const NCHAR* GetFilename ();
    virtual const WCHAR* GetFilenameW() = 0;
    virtual const ACHAR* GetFilenameA() = 0;
    // 获取总共有多少列
    virtual short GetColumnCount() = 0;
    // 通过列索引获取该列的名字
    // .idx 列索引
    FINLINE const NCHAR* GetColumnName (short idx);
    virtual const WCHAR* GetColumnNameW(short idx) = 0;
    virtual const ACHAR* GetColumnNameA(short idx) = 0;
    // 通过列名字获取该列的索引
    // .name 列名字
    FINLINE short GetColumnIndex (const NCHAR* name);
    virtual short GetColumnIndexW(const WCHAR* name) = 0;
    virtual short GetColumnIndexA(const ACHAR* name) = 0;

    // 获取当前行指定列数据
    // .idx 当前行的列索引
    // 说明：该列不填或首字符是0为假，其它为真。如“075”视为假，“75”视为真）
    virtual bool GetBool(short idx) = 0;
    // 获取当前行指定列数据
    // .idx 当前行的列索引
    virtual int GetInt(short idx) = 0;
    // 获取当前行指定列数据
    // .idx 当前行的列索引
    virtual float GetFloat(short idx) = 0;
    // 获取当前行指定列数据
    // .idx 当前行的列索引
    virtual double GetDouble(short idx) = 0;
    // 获取当前行指定列数据
    // .idx 当前行的列索引
    // .return 该列ARGB格式颜色结果，默认0xFFFFFFFF
    // 注意：书写方法，X=255,10,255,40
    virtual DWORD GetColor(short idx) = 0;
    // 获取当前行指定列数据
    // .idx 当前行的列索引
    // .return 该列RECT结果，默认全0
    // 注意：书写方法，X=10,10,42,42
    virtual RECT GetRect(short idx) = 0;
    // 获取当前行指定列数据
    // .idx 当前行的列索引
    // .return 该列FRect结果，默认全0
    // 注意：书写方法，X=10,10,32,32
    virtual FRect GetFRect(short idx) = 0;
    // 获取当前行指定列数据
    // .idx 当前行的列索引
    // .return 该列字符串首地址
    // 注意：该地址仅在本类生存周期内有效，调用Close以后也将无效
    FINLINE const NCHAR* GetString (short idx);
    virtual const WCHAR* GetStringW(short idx) = 0;
    virtual const ACHAR* GetStringA(short idx) = 0;
    FINLINE bool GetString (short idx, FString & out);
    virtual bool GetStringW(short idx, FStringW& out) = 0;
    virtual bool GetStringA(short idx, FStringA& out) = 0;
    // 通过当前行的指定列索引取得int型2D坐标
    // .idx 当前行的列索引
    // .pt 返回值存放地址，要求为：int pt[2]
    // 注意：书写方法，X=100,100
    virtual void GetInt2D(short idx, int* pt) = 0;
    // 通过当前行的指定列索引取得int型2D坐标
    // .idx 当前行的列索引
    // .pt 返回值存放地址，要求为：int pt[3]
    // 注意：书写方法，X=100,100,100
    virtual void GetInt3D(short idx, int* pt) = 0;
    // 通过当前行的指定列索引取得float型2D坐标
    // .idx 当前行的列索引
    // .pt 返回值存放地址，要求为：int pt[2]
    // 注意：书写方法，X=100,100
    virtual void GetFloat2D(short idx, float* pt) = 0;
    // 通过当前行的指定列索引取得float型2D坐标
    // .idx 当前行的列索引
    // .pt 返回值存放地址，要求为：int pt[3]
    // 注意：书写方法，X=100,100,100
    virtual void GetFloat3D(short idx, float* pt) = 0;

    // 测试当前行是否已经过了文件尾部
    virtual bool IsEOF() = 0;
    // 将当前行上移一行
    // .return 是否移动成功
    virtual bool MovePrev() = 0;
    // 将当前行下移一行
    // .return 是否移动成功
    virtual bool MoveNext() = 0;
    // 将游当前行移到第一个行（有效行）
    virtual void MoveFirst() = 0;
    // 将当前行移到最后一个行（有效行）
    virtual void MoveLast() = 0;
};

#include "Core/IFDoc_CSV_inl.h"

extern FAPI IFCSV* FNewCSV(FNEW_FUNC_API);